wayland: Fix up key event translation
authorMatthias Clasen <mclasen@redhat.com>
Sat, 6 Apr 2013 14:40:56 +0000 (10:40 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 6 Apr 2013 14:48:57 +0000 (10:48 -0400)
The is_modifier field is supposed to be set if the key
would act as a modifier, not if any modifiers are currently
active. To fix this, introduce a private
_gdk_wayland_keymap_key_is_modifier function.

At the same time, make the hardware_keycode field in key
events actually contain the hardware keycode, not a copy
of the keyval.

gdk/wayland/gdkdevice-wayland.c
gdk/wayland/gdkkeys-wayland.c
gdk/wayland/gdkprivate-wayland.h

index cd7e5e3b6575a8894c34ea1ed282d373c78d751d..b793b922412d898fc6baf94accc0b39d4bdf037d 100644 (file)
@@ -1032,10 +1032,9 @@ deliver_key_event(GdkWaylandDeviceData *device,
   event->button.time = time;
   event->key.state = device->modifiers;
   event->key.group = 0;
-  event->key.hardware_keycode = sym;
+  event->key.hardware_keycode = key;
   event->key.keyval = sym;
-
-  event->key.is_modifier = device->modifiers > 0;
+  event->key.is_modifier = _gdk_wayland_keymap_key_is_modifier (keymap, key);
 
   translate_keyboard_string (&event->key);
 
index a7427045af44b96f2cc5da70db36b44e735dc3ec..2670700e11da343a128e09edf9da84851655e463 100644 (file)
@@ -432,3 +432,23 @@ struct xkb_state *_gdk_wayland_keymap_get_xkb_state (GdkKeymap *keymap)
 {
   return GDK_WAYLAND_KEYMAP (keymap)->xkb_state;
 }
+
+gboolean
+_gdk_wayland_keymap_key_is_modifier (GdkKeymap *keymap,
+                                     guint      keycode)
+{
+  struct xkb_keymap *xkb_keymap = GDK_WAYLAND_KEYMAP (keymap)->xkb_keymap;
+  struct xkb_state *xkb_state;
+  gboolean is_modifier;
+
+  is_modifier = FALSE;
+
+  xkb_state = xkb_state_new (xkb_keymap);
+
+  if (xkb_state_update_key (xkb_state, keycode, XKB_KEY_DOWN) & XKB_STATE_MODS_EFFECTIVE)
+    is_modifier = TRUE;
+
+  xkb_state_unref (xkb_state);
+
+  return is_modifier;
+}
index 84210435069c2b8e4e9bc764fddbd8c491e32965..e0789525724a674cb54587aaf64ee8efc7ec1e72 100644 (file)
@@ -55,6 +55,8 @@ void       _gdk_wayland_keymap_update_from_fd (GdkKeymap *keymap,
                                                uint32_t   size);
 struct xkb_state *_gdk_wayland_keymap_get_xkb_state (GdkKeymap *keymap);
 struct xkb_keymap *_gdk_wayland_keymap_get_xkb_keymap (GdkKeymap *keymap);
+gboolean           _gdk_wayland_keymap_key_is_modifier (GdkKeymap *keymap,
+                                                        guint      keycode);
 
 void       _gdk_wayland_display_finalize_cursors (GdkWaylandDisplay *display);
 void       _gdk_wayland_display_update_cursors (GdkWaylandDisplay      *display,